<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件

/**
 * 生成随机字符串
 * @param $length @长度
 * @return null|string
 */
function getRandChar($length){
    $str = null;
    $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
    $max = strlen($strPol)-1;

    for($i=0;$i<$length;$i++){
        $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
    }
    return $str;
}

/**
<<<<<<< HEAD
 * 以POST方式提交数据
=======
 * 以POST方式提交数据asdasd
>>>>>>> 0b6f3064057e6c05a64093a7ee93393f6a19e646
 * @param $url
 * @param $data
 * @return mixed
 */
function post_data($url, $data)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $res = curl_exec($ch);
    curl_close($ch);
    $res = json_decode($res, true);

    return $res;
}

/**
 * 以GET方式提交数据
 * @param $url
 * @param bool $is_json_decode
 * @return mixed
 */
function get_data($url, $is_json_decode = true)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回

    $res = curl_exec($ch);
    curl_close($ch);
    $res = $is_json_decode ? json_decode($res, true) : $res;

    return $res;
}

/**
 * api统一返回格式
 * @param $code
 * @param array $data
 * @param string $msg
 * @return array
 */
function api_return($code, $data = [], $msg = 'success') {
    return ['code' => (int)$code, 'data' => $data, 'msg' => $msg];
}

/**
 * 给图片补上域名
 * @param string $img
 * @param string $default
 * @return string
 */
function get_img_url($img = '', $default = '')
{
    if (!$img)
    { // 没有图片使用默认图
        $img = config('image_host') . '/static/home/images/default.png';
    } else {
        if (!preg_match('/^((https|http)?:\/\/)[^\s]+/i', $img)) // 有图片检查是否有http://
        {
            $img = config('image_host') . '/' . $img; // 没有就拼装图片地址域名
        }
    }
    return $img;
}

/**
 * 是否微信环境
 * @return bool
 */
function is_weixin()
{
    if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false)
    {
        return true;
    }
    return false;
}

/**
 * 获取短信接口返回码对应描述信息
 * @param $code
 * @return mixed
 */
function get_note_error_msg($code) {
    $msg_array = [
        101 => '无此用户',
        102 => '密码错',
        103 =>	'提交过快（提交速度超过流速限制）',
        104 =>	'系统忙（因平台侧原因，暂时无法处理提交的短信）',
        105 =>	'敏感短信（短信内容包含敏感词）',
        106 =>	'消息长度错（>536或<=0）',
        107 =>	'包含错误的手机号码',
        108 =>	'手机号码个数错（群发>50000或<=0;单发>200或<=0）',
        109 =>	'无发送额度（该用户可用短信数已使用完）',
        110 =>	'不在发送时间内',
        111 =>	'超出该账户当月发送额度限制',
        112 =>	'无此产品，用户没有订购该产品',
        113 =>	'extno格式错（非数字或者长度不对）',
        115 =>	'自动审核驳回',
        116 =>	'签名不合法，未带签名（用户必须带签名的前提下）',
        117 =>	'IP地址认证错,请求调用的IP地址不是系统登记的IP地址',
        118 =>	'用户没有相应的发送权限',
        119 =>	'用户已过期',
        120 =>	'测试内容不是白名单'
    ];
    return $msg_array[$code];
}


/**
 * 检查验证码
 * @param $code
 * @param $mobile
 * @return array
 */
function check_send_code($code, $mobile) {
    $where = ['code' => $code,'mobile' => $mobile];
    $model = model('note_code');
    $code = $model->where($where)->order('id desc')->find();
    //return ['code' => 0,'msg' => $model->getLastSql()];
    if (!$code)
        return ['code' => 0,'msg' => '验证码不存在'];
    if ($code['status'] > 0)
        return ['code' => 0,'msg' => '验证码已使用'];
    if ($code['create_time'] < (time() - 360))
        return ['code' => 0,'msg' => '验证码已过期 - ' . $code['create_time'] . ' - ' . (time() - 360)];

    // 将验证码状态改为已使用
    model('note_code')->where($where)->update(['status' => 1]);

    return ['code' => 200,'msg' => 'SUCCESS'];
}

/**
 * 获取上级市场线
 * @param $parent_mobile
 * @return array|bool
 */
function get_parents($parent_mobile) {
    $parent = model('member')->where('username', $parent_mobile)->find();
    if (!$parent) {
        return false;
    }
    return ['parents' => $parent['parents'] ? $parent['parents'] . ',' . $parent['id'] : $parent['id'],'id' => $parent['id']];
}

/**
 * 获取远程图片保存到本地
 * @param string $url
 * @远程图片地址
 * @param string $fileDir
 * @本地图片保存路径
 * @param string $fileName
 * @本地图片名称
 */
function getImage($url = '', $fileDir = '', $fileName = '')
{
    if (!is_dir($fileDir))
    {
        mkdir($fileDir);
    }
    $fileName = $fileDir . $fileName;
    $ch = curl_init();
    $fp = fopen($fileName, 'wb');

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);

    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
}

/**
 * 给二维码添加logo
 * @param $qr_code_url (二维码图片地址
 * @param string $logo
 * (默认值是一张图片
 */
function erweima_add_logo($qr_code_url, $logo = '')
{
    $logo = $logo ? $logo : ROOT_PATH . 'public' . DS . 'static' . DS . 'home' . DS . 'images' . DS . 'erweima_logo.png';
    $QR = $qr_code_url; // 已经生成的原始二维码图

    if ($logo)
    {
        $QR = imagecreatefromstring(file_get_contents($QR));
        $logo = imagecreatefromstring(file_get_contents($logo));
        $QR_width = imagesx($QR); // 二维码图片宽度
        $QR_height = imagesy($QR); // 二维码图片高度
        $logo_width = imagesx($logo); // logo图片宽度
        $logo_height = imagesy($logo); // logo图片高度
        $logo_qr_width = $QR_width / 6;
        $scale = $logo_width / $logo_qr_width;
        $logo_qr_height = $logo_height / $scale;
        $from_width = ($QR_width - $logo_qr_width) / 2;
        // 重新组合图片并调整大小
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
    }
    // 输出图片
    imagepng($QR, $qr_code_url);
}

/**
 * 微信模版消息
 * @param $data
 */
function send_msg($data)
{
    $options = config('wechat');
    $wechatObj = new \Wechat\TPWechat($options);
    $access_token = $wechatObj->checkAuth();
    $url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' . $access_token;
    post_data($url, json_encode($data));
}

/**
 * 生成验证码
 */
function GetVerify(){
    $Verify = new \verify\Verify();
    $Verify->length   = 4;
    $Verify->entry();
}

/**
 * @param $msg
 * @param $order_sn
 */
function add_error_log($msg, $order_sn = '') {
    model('error_log')->save(['msg' => $msg, 'order_sn' => $order_sn]);
}

/**
 * 获取实名认证状态
 * @param $status
 * @return mixed
 */
function get_certification_status($status) {
    $status_array = ['未认证', '待审核', '审核通过', '认证失败'];
    return $status_array[$status];
}

/**
 * api接口身份认证
 * @param $params
 * @param $action
 * @return array
 */
function check_merchant($params, $action)
{
    $sign = $params['sign'];
    $key = 'jgsdfjkfgjs#$%&khs2423hkfh';

    $check_sign = md5($key . $action);

    if ($check_sign != $sign) {
        return [
            'data' => '','code' => 0,'msg' => '接口验证失败'
        ];
    }
    return [
        'data' => '','code' => 200,'msg' => 'SUCCESS'
    ];
}

/**
 * 添加接口请求日志
 * @param $param
 * @param $action
 * @return array
 */
function add_interface_request_log($param, $action)
{
    // $log['app_id'] = $param['app_id'];
    $log['interface'] = $action;
    $log['param'] = $param;
    $rs = model('interface_request_log')->save($log);
    if (!$rs)
        return [
            'data' => '','code' => 0,'msg' => '接口请求记录添加失败'
        ];
    else
        return [
            'data' => '','code' => 200,'msg' => 'SUCCESS'
        ];
}

/**
 * 调用接口方法
 * @param $action
 * @param array $data
 * @param string $method_type
 * @return array|mixed|\think\response\Json
 */
function invoke_api($action, $data = [], $method_type = '') {
    $apiList = config('api'); // 接口列表
    $classNamespace = $api_action = ''; // 初始化 接口地址、接口方法
    $there_param = true;
    // 根据 请求接口方法 查找 接口地址
    foreach ($apiList as $key => $values) {
        if ($action == $key) {
            $api_action = $action;
            $method = $values['method'];
            $classNamespace = $values['namespace'];
            $there_param = $values['there_param'];
            break;
        }
    }

    // 如果没有找到对应的接口 返回错误信息
    if (!$api_action) {
        return [  'data' => '','code' => 0,'msg' => '接口不存在','interface' => $action ];
    }

    // 判断接口请求方式
    if ($method_type && $method_type != $method) {
        return [ 'data' => '', 'code' => 0, 'msg' => '请使用' . $method . '方式访问', 'interface' => $action ];
    }

    // 判断接口是否需要传递参数
    if ($there_param) {
        if (empty($data)) {
            return [ 'data' => '', 'code' => 0, 'msg' => '参数不能为空', 'interface' => $action ];
        }
    }

    $param = $data;
    if (!is_array($param)) {
        // 如果不是数组就进行json解析
        $param = json_decode($param, true); //
        if ($param === null || $param === false) {
            return ['data' => [], 'code' => 0, 'msg' => '参数格式错误','interface' => $action ];
        }
    }

    // 使用php反射机制 调用对应的接口地址中的接口方法
    $class = new \ReflectionClass($classNamespace);
    $classMethod = $class->getMethod($api_action);
    // return json($param);
    $return = call_user_func(array( $class->name,$classMethod->name ), $param);
    $return['interface'] = $action;

    return $return;
}

/**
 * 本地调用接口方法
 * @param $action
 * @param array $data
 * @return array|mixed|\think\response\Json
 */
function local_invoke_api($action, $data = [])
{
    $return = invoke_api($action, $data);
    if (!request()->isAjax()) {  // 不是ajax请求的时候检查数据获取是否正确， 发生错误则加载错误页面
        if ($return['code'] != 200) {
            $this->assign('msg', $return['msg']); // 输出错误信息
            return view('public/error');  // 加载错误页面
        }
    }
    return $return;
}

/**
 * 获取剩余天、时、分
 * @param $second
 * @return string
 */
function stime($second){
    if ($second <= 0 ) {
        return '';
    }
    $day=floor($second/(3600*24));
    $second = $second%(3600*24);
    $hour = floor($second/3600);
    $second = $second%3600;
    $minute = floor($second/60);
    $second = $second%60;
//    return "剩余".$day."天".$hour."小时".$minute."分".$second."秒";
    return "剩余".$day."天".$hour."小时".$minute."分";
}

/**
 * 把时间转换成 几秒、几分钟、几小时、几天前
 * @param $show_time
 * @return string
 */
function time_tran($show_time) {
    $now_time = time();
    $dur = $now_time - $show_time;
    if ($dur < 0) {
        return date('Y-m-d H:i:s', $show_time);
    } else {
        if ($dur < 60) {
            return $dur . '秒前';
        } else {
            if ($dur < 3600) {
                return floor($dur / 60) . '分钟前';
            } else {
                if ($dur < 86400) {
                    return floor($dur / 3600) . '小时前';
                } else {
                    if ($dur < 259200) {//3天内
                        return floor($dur / 86400) . '天前';
                    } else {
                        return date('Y-m-d H:i:s', $show_time);
                    }
                }
            }
        }
    }
}

/**
 * 获取半径范围内的经纬度
 * @param $lat
 * @param $lon
 * @param $radius
 * @return array
 */
function getAround($lat, $lon, $radius)
{
    $PI = 3.14159265;
    $latitude = $lat;
    $longitude = $lon;

    $degree = (24901 * 1609) / 360.0;
    $radiusMile = $radius;

    $dpmLat = 1 / $degree;
    $radiusLat = $dpmLat * $radiusMile;
    $minLat = $latitude - $radiusLat;
    $maxLat = $latitude + $radiusLat;

    $mpdLng = $degree * cos($latitude * ($PI / 180));
    $dpmLng = 1 / $mpdLng;
    $radiusLng = $dpmLng * $radiusMile;
    $minLng = $longitude - $radiusLng;
    $maxLng = $longitude + $radiusLng;
    return [$minLat,$maxLat,$minLng,$maxLng];
}

/**
 * 活动状态
 * @param $status
 * @param $start_time
 * @return mixed
 */
function get_activity_status($status, $start_time) {
    $now = $start_time > time() ? '未开始' :  '正在进行';
    $status_array = [
        '', '待支付', $now, '已结束'
    ];
    return $status_array[$status];
}

/**
 * 获取活动进度
 * @param $status
 * @param $start_time
 * @return mixed
 */
function get_activity_status_schedule($status, $start_time) {
    $now = $start_time > time() ? '未开始' :  '正在进行';
    $status_array = [
        '', '发起活动', '发起活动->支付保证金->' . $now, '发起活动->支付保证金->活动已结束'
    ];
    return $status_array[$status];
}

/**
 * 活动参与状态
 * @param $status
 * @return mixed
 */
function get_activity_participation_status($status) {
    $status_array = [
        '', '已申请', '审核通过', '审核拒绝', '活动结束'
    ];
    return $status_array[$status];
}

/**
 * 获取订单状态
 * @param $status
 * @param $type
 * @return mixed
 */
function get_order_status($status, $type) {
    $status_array = [
        '', $type == 1 ? '待接单' : '待支付', '商家已接单', '待支付', '已支付', '已发货', '已签收', '已取消',
    ];
    return $status_array[$status];
}

/**
 * 获取补货状态
 * @param $status
 * @return mixed
 */
function get_replenishment_status($status) {
    $status_array = [
        '', '已申请', '已出货', '已收货', '已取消'
    ];
    return $status_array[$status];
}